GetRawInputDeviceList (user32)
Last changed: gmartinnc-38.104.62.78

.
Summary
The GetRawInputDeviceList function enumerates the raw input devices attached to the system.

C# Signature:

    [StructLayout( LayoutKind.Sequential )]
    public struct RAWINPUTDEVICELIST
    {
        public int hDevice;
        public int dwType;
    }

    [DllImport("user32.dll")]
    public static extern uint GetRawInputDeviceList
    (
        IntPtr pRawInputDeviceList,
        ref int puiNumDevices,
        int cbSize
    );

VB.Net Signature:

   < StructLayout( LayoutKind.Sequential )> _
    Public Structure RAWINPUTDEVICELIST
       Public hDevice as Int32
       Public dwType as UInt32
    End Structure

   <DllImport("user32.dll", CharSet:=CharSet.Auto,
    EntryPOint:="GetRawInputDeviceList", SetLastError:=True)> _
    Public Function GetRawInputDeviceList(ByVal pRawInputDeviceList As
    IntPtr, ByRef puiNumDevices As Int32, ByVal cbSize As Int32) As Int32
    End Function

VB Signature:

Declare Function GetRawInputDeviceList Lib "user32.dll" (ByVal pRawInputDeviceList As
    IntPtr, ByRef puiNumDevices As Long, ByVal cbSize As Long) As Long

User-Defined Types:

None.

Alternative Managed API:

Notes:

None.

Tips & Tricks:

Sample Code:

int structSize = Marshal.SizeOf(typeof(RAWINPUTDEVICELIST));    
int bufferCount = 10;
IntPtr buffer = Marshal.AllocHGlobal(bufferCount * structSize);

int deviceCount = GetRawInputDeviceList(buffer, ref bufferCount, structSize);

for (int i = 0; i < deviceCount; ++i)
{
    RAWINPUTDEVICELIST device = (RAWINPUTDEVICELIST)Marshal.PtrToStructure(
new IntPtr((buffer.ToInt32() + (structSize * i))),typeof(RAWINPUTDEVICELIST));
...
}

    // A convenient function for getting all raw input devices.
    // This method will get all devices, including virtual devices
    // For remote desktop and any other device driver that's registered
    // as such a device.
    public static RAWINPUTDEVICELIST[] GetAllRawDevices()
    {
        uint deviceCount = 0;
        int dwSize = Marshal.SizeOf(typeof(RAWINPUTDEVICELIST));

        // First call the system routine with a null pointer
        // for the array to get the size needed for the list
        int retValue = (int)GetRawInputDeviceList(IntPtr.Zero, ref deviceCount, (uint)dwSize);

        // If anything but zero is returned, the call failed, so return a null list
        if (0 != retValue)
        return null;

        // Now allocate an array of the specified number of entries
        RAWINPUTDEVICELIST[] deviceList = new RAWINPUTDEVICELIST[deviceCount];
        IntPtr pRawInputDeviceList = Marshal.AllocHGlobal((int)(dwSize * deviceCount));

        // Now make the call again, using the array
        GetRawInputDeviceList(pRawInputDeviceList, ref deviceCount, (uint)dwSize);

        // Fill up the array with the structures
        for (int i = 0; i < deviceCount; i++)
        {
        deviceList[i] = (RAWINPUTDEVICELIST)Marshal.PtrToStructure(
            new IntPtr((pRawInputDeviceList.ToInt32() + (dwSize * i))),
            typeof(RAWINPUTDEVICELIST));
        }

        // Free up the memory we first got the information into as
        // it is no longer needed, since the structures have been
        // copied to the deviceList array.
        Marshal.FreeHGlobal(pRawInputDeviceList);

        // Finally, return the filled in list
        return deviceList;
    }

Documentation